<!DOCTYPE html>
<html lang="en">

<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>GNU Offloading and Multi-Processing Project (GOMP)</title>
<link rel="stylesheet" type="text/css" href="https://gcc.gnu.org/gcc.css" />
</head>

<body>

<h1>GNU Offloading and Multi-Processing Project (GOMP)</h1>

<p>The GOMP project consists of implementation of OpenMP and OpenACC to
permit annotating the source code to permit running it concurrently with
thread parallelization and on offloading devices (<q>accelerators</q> such
as GPUs), including the associated run-time library and API routines. Both
OpenMP and OpenACC are supported with GCC's C, C++ and Fortran compilers.</p>

<h2>Content</h2>
<ul>
  <li><a href="#usage">Usage</a></li>
  <li><a href="#documentation">Documentation</a></li>
  <li><a href="#history_and_goal">History and Project Goal</a></li>
  <li><a href="#contributing">Contributing</a></li>
  <li><a href="#bugs">Reporting Bugs</a></li>
  <li><a href="#implementation-status">OpenMP Implementation Status</a>:
  <a href="#omp2.5">2.5</a> · <a href="#omp3.0">3.0</a> ·
  <a href="#omp3.1">3.1</a> · <a href="#omp4.0">4.0</a> ·
  <a href="#omp4.5">4.5</a> · <a href="#omp5.0">5.0</a> ·
  <a href="#omp5.1">5.1</a> · <a href="#omp5.2">5.2</a></li>
  <li><a href="#omp-status">OpenMP Releases and Status</a></li>
</ul>

<h2 id="usage">Usage</h2>
<ul>
  <li>To enable <strong><a href="https://www.openmp.org">OpenMP</a></strong>,
  use <a
  href="https://gcc.gnu.org/onlinedocs/gcc/C-Dialect-Options.html#index-fopenmp"
  ><code>-fopenmp</code></a>; <code>-fopenmp-simd</code> can be used
  to enable only the SIMD vectorization and loop-transformation constructs
  without creating multiple threads, offloading code or adding library
  dependency.</li>
  <li>To enable <strong><a href="https://www.openacc.org">OpenACC</a></strong>,
  use <a
  href="https://gcc.gnu.org/onlinedocs/gcc/C-Dialect-Options.html#index-fopenacc"
  ><code>-fopenacc</code></a>.</li>
  <li>If either is enabled, offloading is automatically generated for all
  offload-device types for which the compiler has been configured. Use <a
  href="https://gcc.gnu.org/onlinedocs/gcc/C-Dialect-Options.html#index-foffload"
  ><code>-foffload=</code></a> to disable or specify the offload-devices to be
  used. Use <a
  href="https://gcc.gnu.org/onlinedocs/gcc/C-Dialect-Options.html#index-foffload-options"
  ><code>-foffload-options=</code></a> to pass device-specific compiler and
  linker flags.</li>
</ul>

<p>Diagnostics</p>
<ul>
  <li>The <a
  href="https://gcc.gnu.org/onlinedocs/gcc/Developer-Options.html#index-fopt-info"
  ><code>-fopt-info</code></a> flag provides details about compile-time performed
  optimizations.</li>
  <li>Environment variables can be used to influence run-time behavior and output
  more data, useful for debugging or performance tuning. See the <a
  href="https://gcc.gnu.org/onlinedocs/libgomp/">GNU libgomp</a> manual for
  details.</li>
</ul>

<h2 id="documentation">Documentation</h2>
<ul>
  <li><a href="https://gcc.gnu.org/onlinedocs/libgomp/">GNU libgomp</a> manual
  for API routines, environment variables and implementation details.</li>
  <li><a href="https://www.openmp.org/specifications/">OpenMP specification</a>,
  including OpenMP API examples documents, reference cards and additional
  definitions specification.</li>
  <li><a href="https://www.openacc.org/specification">OpenACC</a>
  specification.</li>
  <li>Related GCC wiki pages: <a href="https://gcc.gnu.org/wiki/openmp"
  >openmp</a>, <a href="https://gcc.gnu.org/wiki/OpenACC">OpenACC</a>,
  <a href="https://gcc.gnu.org/wiki/Offloading">Offloading</a>.</li>
</ul>

<h2 id="history_and_goal">History and Project Goal</h2>

<p>The GOMP project has developed an implementation of
<a href="https://www.openmp.org">OpenMP</a>
for the C, C++, and <a href="../../fortran/">Fortran</a>
compilers in the <a href="../../">GNU
Compiler Collection</a> and is further improving it. As part of the <a
href="../../">GNU Project</a>, GOMP
simplifies parallel programming for all GNU system variants. This
effort operates in an open environment to attract developers and
ensure applicability across multiple architectures and
applications.</p>

<p>Traditionally, programmers have used architecture-specific
methods to effectively program tightly-parallelized
computers &mdash; high band-width clusters, SMP machines, or
multi-core processors. Parallel programming has thus been a
time-consuming and arcane task.
</p>

<p>OpenMP offers a simple way of exploiting parallelism without
interfering with algorithm design; an OpenMP program compiles and
operates correctly in both parallel and serial execution
environments. Using OpenMP's directive-based parallelism also
simplifies the act of converting existing serial code to
efficient parallel code.</p>

<p>OpenMP additionally permits to offload computations on
accelerators such as <abbr title="Graphical Processing Units">GPUs</abbr>,
making use of their highly parallel computation support; if
no accelerator is available, as fallback, the computation is
then done on the host.</p>

<p>To remain relevant, free software development tools must
support emerging technologies. By implementing OpenMP, GOMP
provides a simplified syntax tools for creating software targeted
at parallel architectures. OpenMP's platform-neutral syntax
meshes well with the portability goals of GCC and other GNU
projects.</p>

<p>The GOMP release includes a support library, libgomp, and
extensions to target language parsers.  A long-term goal is
the generation of efficient and small code for OpenMP applications.</p>

<p>When support for OpenACC was added, the project name <q>GOMP</q>
was reinterpreted as <q>GNU Offloading and Multi-Processing</q> instead
of denoting <q>GNU OpenMP</q>.

<h2 id="contributing">Contributing</h2>
<p>We encourage everyone to
<a href="../../contribute.html">contribute changes</a>
and help test GOMP.  GOMP has been merged into mainline GCC.</p>

<h2 id="bugs">Reporting Bugs</h2>
<p>Please add <q>openmp</q> or <q>openacc</q> to the keywords field when
filing a <a href="../../bugs/">bug report</a>.</p>

<h2 id="implementation-status">OpenMP Implementation Status</h2>

<p>Implementation status in libgomp manual:
<a href="https://gcc.gnu.org/onlinedocs/libgomp/OpenMP-Implementation-Status.html"
>Mainline (GCC 13)</a>,
<a href="https://gcc.gnu.org/onlinedocs/gcc-12.1.0/libgomp/OpenMP-Implementation-Status.html"
>GCC 12</a>.</p>

<p>Disclaimer: A feature might be only fully supported in a later GCC version
than listed, depending on resolved corner cases and optimizations.</p>



<h3 id="omp2.5">OpenMP 2.5</h3>
<ul>
  <li>Supported since GCC 4.2</li>
</ul>

<h3 id="omp3.0">OpenMP 3.0</h3>
<ul>
  <li>Supported since GCC 4.4</li>
</ul>

<h3 id="omp3.1">OpenMP 3.1</h3>
<ul>
  <li>Supported since GCC 4.7</li>
</ul>

<h3 id="omp4.0">OpenMP 4.0</h3>
<ul>
  <li><strong>C/C++:</strong> Supported since GCC 4.9</li>
  <li><strong>Fortran:</strong> Supported since GCC 4.9.1</li>
</ul>

<h3 id="omp4.5">OpenMP 4.5</h3>
<ul>
  <li><strong>C/C++:</strong> Supported since GCC 6</li>
  <li><strong>Fortran:</strong> Partial support since GCC 7, full support since GCC 11</li>
</ul>


<h3 id="omp5.0">OpenMP 5.0</h3>

<table class="ompstatus">
<thead>
  <tr>
    <th>Feature</th>
    <th>GCC Version</th>
    <th>Comments</th>
  </tr>
</thead>
<tbody>
  <tr>
    <td><code>in_reduction</code> clause on task constructs</td>
    <td class="supported"><a href="../../gcc-9/changes.html#c-family">GCC&nbsp;9</a></td>
    <td></td>
  </tr>
  <tr>
    <td>Supporting C++'s range-based for loop</td>
    <td class="supported"><a href="../../gcc-9/changes.html#c-family">GCC&nbsp;9</a></td>
    <td></td>
  </tr>
  <tr>
    <td>Iterators</td>
    <td class="supported"><a href="../../gcc-9/changes.html#c-family">GCC&nbsp;9</a></td>
    <td></td>
  </tr>
  <tr>
    <td>!= as relational-op in canonical loop form for C/C++</td>
    <td class="supported"><a href="../../gcc-9/changes.html#c-family">GCC&nbsp;9</a></td>
    <td></td>
  </tr>
  <tr>
    <td>C/C++'s lvalue expressions in <code>depend</code> clauses</td>
    <td class="supported"><a href="../../gcc-9/changes.html#c-family">GCC&nbsp;9</a></td>
    <td></td>
  </tr>
  <tr>
    <td><code>mutexinoutset</code> <em>dependence-type</em> for <code>depend</code> clause</td>
    <td class="supported"><a href="../../gcc-9/changes.html#c-family">GCC&nbsp;9</a></td>
    <td></td>
  </tr>
  <tr>
    <td><code>depobj</code> construct and depend objects </td>
    <td class="supported"><a href="../../gcc-9/changes.html#c-family">GCC&nbsp;9</a></td>
    <td></td>
  </tr>
  <tr>
    <td><code>depend</code> clause on <code>taskwait</code></td>
    <td class="supported"><a href="../../gcc-9/changes.html#c-family">GCC&nbsp;9</a></td>
    <td></td>
  </tr>
  <tr>
    <td><code>teams</code> construct outside an enclosing target region</td>
    <td class="supported"><a href="../../gcc-9/changes.html#c-family">GCC&nbsp;9</a></td>
    <td></td>
  </tr>
  <tr>
    <td>Clauses <code>if</code>, <code>nontemporal</code> and <code>order(concurrent)</code> in <code>simd</code> construct</td>
    <td class="supported"><a href="../../gcc-9/changes.html#c-family">GCC&nbsp;9</a>/<a href="../../gcc-10/changes.html#languages">GCC&nbsp;10</a></td>
    <td></td>
  </tr>
  <tr>
    <td><code>defaultmap</code> extensions</td>
    <td class="supported"><a href="../../gcc-9/changes.html#c-family">GCC&nbsp;9</a></td>
    <td></td>
  </tr>
  <tr>
    <td><code>hint</code> clause on the <code>atomic</code> construct</td>
    <td class="partial"><a href="../../gcc-9/changes.html#c-family">GCC&nbsp;9</a></td>
    <td>Stub only</td>
  </tr>
  <tr>
    <td>Weak memory ordering clauses on <code>atomic</code> and <code>flush</code> construct</td>
    <td class="supported"><a href="../../gcc-9/changes.html#c-family">GCC&nbsp;9</a></td>
    <td></td>
  </tr>
  <tr>
    <td>Combined master constructs</td>
    <td class="supported"><a href="../../gcc-9/changes.html#c-family">GCC&nbsp;9</a></td>
    <td></td>
  </tr>
  <tr>
    <td>Runtime routines and environment variables to display runtimethread affinity information</td>
    <td class="supported"><a href="../../gcc-9/changes.html#c-family">GCC&nbsp;9</a></td>
    <td></td>
  </tr>
  <tr>
    <td><code>omp_pause_resource</code> and <code>omp_pause_resource_all</code> runtime routines</td>
    <td class="supported"><a href="../../gcc-9/changes.html#c-family">GCC&nbsp;9</a></td>
    <td></td>
  </tr>
  <tr>
    <td><code>nonmonotonic</code> as default loop schedule modifier for worksharing-loop constructs</td>
    <td class="supported"><a href="../../gcc-9/changes.html#c-family">GCC&nbsp;9</a></td>
    <td></td>
  </tr>
  <tr>
    <td><code>atomic</code> constructs in <code>simd</code></td>
    <td class="supported"><a href="../../gcc-9/changes.html#c-family">GCC&nbsp;9</a></td>
    <td></td>
  </tr>
  <tr>
    <td><code>task_reduction</code> clause with <code>taskgroup</code></td>
    <td class="supported"><a href="../../gcc-9/changes.html#c-family">GCC&nbsp;9</a></td>
    <td></td>
  </tr>
  <tr>
    <td><code>task</code> modifier to <code>reduction</code> clause</td>
    <td class="supported"><a href="../../gcc-9/changes.html#c-family">GCC&nbsp;9</a></td>
    <td></td>
  </tr>
  <tr>
    <td><code>reduction</code> and <code>in_reduction</code> clauses on <code>taskloop</code> and <code>taskloop simd</code> constructs</td>
    <td class="supported"><a href="../../gcc-9/changes.html#c-family">GCC&nbsp;9</a></td>
    <td></td>
  </tr>
  <tr>
    <td><code>taskloop</code> construct cancelable by <code>cancel</code> construct</td>
    <td class="supported"><a href="../../gcc-9/changes.html#c-family">GCC&nbsp;9</a></td>
    <td></td>
  </tr>
  <tr>
    <td>Lock hints were renamed to synchronization hints</td>
    <td class="supported"><a href="../../gcc-9/changes.html#c-family">GCC&nbsp;9</a></td>
    <td></td>
  </tr>
  <tr>
    <td><code>requires</code> directive</td>
    <td class="partial"><a href="../../gcc-9/changes.html#c-family">GCC&nbsp;9</a><br><a href="../../gcc-12/changes.html#languages">GCC&nbsp;12</a><br>&ndash;</td>
    <td>(<code>atomic_default_mem_order</code>)<br>(<code>dynamic_allocators</code>)<br>rest parsing only</td>
  </tr>
  <tr>
    <td><code>conditional</code> modifier to <code>lastprivate</code> clause</td>
    <td class="supported"><a href="../../gcc-10/changes.html#languages">GCC&nbsp;10</a></td>
    <td></td>
  </tr>
  <tr>
    <td><code>scan</code> directive and <code>in_scan</code> modifier for the <code>reduction clause</code></td>
    <td class="supported"><a href="../../gcc-10/changes.html#languages">GCC&nbsp;10</a></td>
    <td></td>
  </tr>
  <tr>
    <td><code>order(concurrent)</code> clause</td>
    <td class="supported"><a href="../../gcc-10/changes.html#languages">GCC&nbsp;10</a></td>
    <td></td>
  </tr>
  <tr>
    <td><code>loop</code> construct</td>
    <td class="supported"><a href="../../gcc-10/changes.html#languages">GCC&nbsp;10</a></td>
    <td></td>
  </tr>
  <tr>
    <td><code>declare variant</code> directive</td>
    <td class="partial"><a href="../../gcc-10/changes.html#languages">GCC&nbsp;10</a>/<a href="../../gcc-11/changes.html#languages">GCC&nbsp;11</a></td>
    <td><em>simd</em> traits not handled correctly</td>
  </tr>
  <tr>
    <td><code>use_device_addr</code> clause on <code>target data</code></td>
    <td class="supported"><a href="../../gcc-10/changes.html#languages">GCC&nbsp;10</a></td>
    <td></td>
  </tr>
  <tr>
    <td>Nested <code>declare target</code> directive</td>
    <td class="supported"><a href="../../gcc-10/changes.html#languages">GCC&nbsp;10</a></td>
    <td></td>
  </tr>
  <tr>
    <td><code>allocate</code> clause</td>
    <td class="partial"><a href="../../gcc-11/changes.html#languages">GCC&nbsp;11</a></td>
    <td>Initial support</td>
  </tr>
  <tr>
    <td><em>target-offload-var</em> ICV and <code>OMP_TARGET_OFFLOAD</code> env variable</td>
    <td class="supported"><a href="../../gcc-11/changes.html#languages">GCC&nbsp;11</a></td>
    <td></td>
  </tr>
  <tr>
    <td>Predefined memory spaces, memory allocators, allocator traits</td>
    <td class="supported"><a href="../../gcc-11/changes.html#languages">GCC&nbsp;11</a></td>
    <td>Some are only stubs</td>
  </tr>
  <tr>
    <td>Non-rectangular loop nests</td>
    <td class="supported"><a href="../../gcc-11/changes.html#languages">GCC&nbsp;11</a><br><a href="../../gcc-13/changes.html#languages">GCC&nbsp;13</a></td>
    <td>C/C++<br>Fortran</td>
  </tr>
  <tr>
    <td>Nested-parallel changes to <em>max-active-levels-var</em> ICV</td>
    <td class="supported"><a href="../../gcc-11/changes.html#languages">GCC&nbsp;11</a></td>
    <td></td>
  </tr>
  <tr>
    <td><code>detach</code> clause to <code>task</code> construct</td>
    <td class="supported"><a href="../../gcc-11/changes.html#languages">GCC&nbsp;11</a></td>
    <td></td>
  </tr>
  <tr>
    <td><code>omp_fulfill_event</code> runtime routine</td>
    <td class="supported"><a href="../../gcc-11/changes.html#languages">GCC&nbsp;11</a></td>
    <td></td>
  </tr>
  <tr>
    <td>Memory management routines</td>
    <td class="supported"><a href="../../gcc-11/changes.html#languages">GCC&nbsp;11</a></td>
    <td></td>
  </tr>
  <tr>
    <td>Implicit <code>declare target</code> directive</td>
    <td class="supported"><a href="../../gcc-11/changes.html#languages">GCC&nbsp;11</a></td>
    <td></td>
  </tr>
  <tr>
    <td><code>omp_get_supported_active_levels</code> routine</td>
    <td class="supported"><a href="../../gcc-11/changes.html#languages">GCC&nbsp;11</a></td>
    <td></td>
  </tr>
  <tr>
    <td><code>in_reduction</code> clause on <code>target</code> constructs</td>
    <td class="partial"><a href="../../gcc-12/changes.html#languages">GCC&nbsp;12</a></td>
    <td><code>nowait</code> only stub</td>
  </tr>
  <tr>
    <td><code>affinity</code> clause to <code>task</code> construct</td>
    <td class="supported"><a href="../../gcc-12/changes.html#languages">GCC&nbsp;12</a></td>
    <td>Stub only</td>
  </tr>
  <tr>
    <td><code>close</code> <em>map-type-modifier</em></td>
    <td class="supported"><a href="../../gcc-12/changes.html#languages">GCC&nbsp;12</a></td>
    <td></td>
  </tr>
  <tr>
    <td><code>omp_get_device_num</code> runtime routine</td>
    <td class="supported"><a href="../../gcc-12/changes.html#languages">GCC&nbsp;12</a></td>
    <td></td>
  </tr>
  <tr>
    <td><code>ancestor</code> modifier on <code>device</code> clause</td>
    <td class="partial"><a href="../../gcc-12/changes.html#languages">GCC&nbsp;12</a></td>
    <td>Reverse offload unsupported</td>
  </tr>
  <tr>
    <td>Mapping C/C++ pointer variables and to assign the address of device memory mapped by an array section</td>
    <td class="supported"><a href="../../gcc-12/changes.html#languages">GCC&nbsp;12</a></td>
    <td></td>
  </tr>
  <tr>
    <td>Mapping of Fortran pointer and allocatable variables, including pointer and allocatable components of variables</td>
    <td class="supported"><a href="../../gcc-12/changes.html#languages">GCC&nbsp;12</a></td>
    <td>Mapping of vars with allocatable components unsupported</td>
  </tr>
  <tr>
    <td>Map-order clarifications</td>
    <td class="partial">?</td>
    <td>To be verified</td>
  </tr>
  <tr>
    <td>Array shaping</td>
    <td class="unsupported">No</td>
    <td></td>
  </tr>
  <tr>
    <td>Array sections with non-unit strides in C and C++</td>
    <td class="unsupported">No</td>
    <td></td>
  </tr>
  <tr>
    <td><code>metadirective</code> directive</td>
    <td class="unsupported">No</td>
    <td></td>
  </tr>
  <tr>
    <td>Collapse of associated loops that are imperfectly nested loops</td>
    <td class="unsupported">No</td>
    <td></td>
  </tr>
  <tr>
    <td><code>allocate</code> directive</td>
    <td class="unsupported">No</td>
    <td></td>
  </tr>
  <tr>
    <td>Discontiguous array section with <code>target update</code> construct</td>
    <td class="unsupported">No</td>
    <td></td>
  </tr>
  <tr>
    <td>C/C++'s lvalue expressions in <code>to</code>, <code>from</code> and <code>map</code> clauses</td>
    <td class="unsupported">No</td>
    <td></td>
  </tr>
  <tr>
    <td><code>declare mapper</code> directive</td>
    <td class="unsupported">No</td>
    <td></td>
  </tr>
  <tr>
    <td>OMPT interface</td>
    <td class="unsupported">No</td>
    <td></td>
  </tr>
  <tr>
    <td>OMPD interface</td>
    <td class="unsupported">No</td>
    <td></td>
  </tr>
</tbody>
</table>


<h3 id="omp5.1">OpenMP 5.1</h3>

<table class="ompstatus">
<thead>
  <tr>
    <th>Feature</th>
    <th>GCC Version</th>
    <th>Comments</th>
  </tr>
</thead>
<tbody>
  <tr>
    <td>OpenMP directive as C++ attribute specifiers</td>
    <td class="supported"><a href="../../gcc-12/changes.html#languages">GCC&nbsp;12</a></td>
    <td></td>
  </tr>
  <tr>
    <td><code>nothing</code> directive</td>
    <td class="supported"><a href="../../gcc-12/changes.html#languages">GCC&nbsp;12</a></td>
    <td></td>
  </tr>
  <tr>
    <td><code>error</code> directive</td>
    <td class="supported"><a href="../../gcc-12/changes.html#languages">GCC&nbsp;12</a></td>
    <td></td>
  </tr>
  <tr>
    <td><code>masked</code> construct</td>
    <td class="supported"><a href="../../gcc-12/changes.html#languages">GCC&nbsp;12</a></td>
    <td></td>
  </tr>
  <tr>
    <td><code>scope</code> directive</td>
    <td class="supported"><a href="../../gcc-12/changes.html#languages">GCC&nbsp;12</a></td>
    <td></td>
  </tr>
  <tr>
    <td><code>strict</code> modifier in the <code>grainsize</code> and <code>num_tasks</code> clauses of the <code>taskloop</code> construct</td>
    <td class="supported"><a href="../../gcc-12/changes.html#languages">GCC&nbsp;12</a></td>
    <td></td>
  </tr>
  <tr>
    <td><code>align</code> clause/modifier in <code>allocate</code> directive/clause and <code>allocator</code> directive</td>
    <td class="supported"><a href="../../gcc-12/changes.html#languages">GCC&nbsp;12</a></td>
    <td>C/C++ on clause only</td>
  </tr>
  <tr>
    <td><code>thread_limit</code> clause to <code>target</code> construct</td>
    <td class="supported"><a href="../../gcc-12/changes.html#languages">GCC&nbsp;12</a></td>
    <td></td>
  </tr>
  <tr>
    <td><code>has_device_addr</code> clause to <code>target construct</code></td>
    <td class="supported"><a href="../../gcc-12/changes.html#languages">GCC&nbsp;12</a></td>
    <td></td>
  </tr>
  <tr>
    <td>Extensions to the <code>atomic</code> directive</td>
    <td class="supported"><a href="../../gcc-12/changes.html#languages">GCC&nbsp;12</a></td>
    <td></td>
  </tr>
  <tr>
    <td><code>seq_cst</code> clause on a <code>flush</code> construct</td>
    <td class="supported"><a href="../../gcc-12/changes.html#languages">GCC&nbsp;12</a></td>
    <td></td>
  </tr>
  <tr>
    <td><code>private</code> and <code>firstprivate</code> argument to <code>default</code> clause in C and C++</td>
    <td class="supported"><a href="../../gcc-12/changes.html#languages">GCC&nbsp;12</a></td>
    <td></td>
  </tr>
  <tr>
    <td><code>omp_set_num_teams</code>, <code>omp_set_teams_thread_limit</code>, <code>omp_get_max_teams</code>, <code>omp_get_teams_thread_limit</code> runtime routines</td>
    <td class="supported"><a href="../../gcc-12/changes.html#languages">GCC&nbsp;12</a></td>
    <td></td>
  </tr>
  <tr>
    <td><code>omp_calloc</code>, <code>omp_realloc</code>, <code>omp_aligned_alloc</code>, and <code>omp_aligned_calloc</code> runtime routines</td>
    <td class="supported"><a href="../../gcc-12/changes.html#languages">GCC&nbsp;12</a></td>
    <td></td>
  </tr>
  <tr>
    <td><code>omp_alloctrait_key_t</code> enum: <code>omp_atv_serialized</code> added, <code>omp_atv_default</code> changed</td>
    <td class="supported"><a href="../../gcc-12/changes.html#languages">GCC&nbsp;12</a></td>
    <td></td>
  </tr>
  <tr>
    <td><code>omp_display_env</code> runtime routine</td>
    <td class="supported"><a href="../../gcc-12/changes.html#languages">GCC&nbsp;12</a></td>
    <td></td>
  </tr>
  <tr>
    <td><code>OMP_PLACES</code> syntax extensions</td>
    <td class="supported"><a href="../../gcc-12/changes.html#languages">GCC&nbsp;12</a></td>
    <td></td>
  </tr>
  <tr>
    <td><code>OMP_NUM_TEAMS</code> and <code>OMP_TEAMS_THREAD_LIMIT</code> env variables</td>
    <td class="supported"><a href="../../gcc-12/changes.html#languages">GCC&nbsp;12</a></td>
    <td></td>
  </tr>
  <tr>
    <td>Support of strictly structured blocks in Fortran</td>
    <td class="supported"><a href="../../gcc-12/changes.html#languages">GCC&nbsp;12</a></td>
    <td></td>
  </tr>
  <tr>
    <td>Support of structured block sequences in C/C++</td>
    <td class="supported"><a href="../../gcc-12/changes.html#languages">GCC&nbsp;12</a></td>
    <td></td>
  </tr>
  <tr>
    <td><code>unconstrained</code> and <code>reproducible</code> modifiers on <code>order</code> clause</td>
    <td class="supported"><a href="../../gcc-12/changes.html#languages">GCC&nbsp;12</a></td>
    <td></td>
  </tr>
  <tr>
    <td><code>inoutset</code> argument to the <code>depend</code> clause</td>
    <td class="supported"><a href="../../gcc-13/changes.html#languages">GCC&nbsp;13</a></td>
    <td></td>
  </tr>
  <tr>
    <td><code>omp_target_is_accessible</code> runtime routine</td>
    <td class="supported"><a href="../../gcc-13/changes.html#languages">GCC&nbsp;13</a></td>
    <td></td>
  </tr>
  <tr>
    <td><code>omp_target_memcpy_async</code> and <code>omp_target_memcpy_rect_async</code> runtime routines</td>
    <td class="supported"><a href="../../gcc-13/changes.html#languages">GCC&nbsp;13</a></td>
    <td></td>
  </tr>
  <tr>
    <td><code>omp_get_mapped_ptr</code> runtime routine</td>
    <td class="supported"><a href="../../gcc-13/changes.html#languages">GCC&nbsp;13</a></td>
    <td></td>
  </tr>
  <tr>
    <td><code>omp_all_memory</code> reserved locator</td>
    <td class="supported"><a href="../../gcc-13/changes.html#languages">GCC&nbsp;13</a></td>
    <td></td>
  </tr>
  <tr>
    <td><code>nowait</code> clause in <code>taskwait</code> directive</td>
    <td class="supported"><a href="../../gcc-13/changes.html#languages">GCC&nbsp;13</a></td>
    <td></td>
  </tr>
  <tr>
    <td><em>target_device trait</em> in OpenMP Context</td>
    <td class="unsupported">No</td>
    <td></td>
  </tr>
  <tr>
    <td><code>target_device</code> selector set in context selectors</td>
    <td class="unsupported">No</td>
    <td></td>
  </tr>
  <tr>
    <td>C/C++'s <code>declare variant</code> directive: elision support of preprocessed code</td>
    <td class="unsupported">No</td>
    <td></td>
  </tr>
  <tr>
    <td><code>declare variant</code>: new clauses <code>adjust_args</code> and <code>append_args</code></td>
    <td class="unsupported">No</td>
    <td></td>
  </tr>
  <tr>
    <td><code>dispatch</code> construct</td>
    <td class="unsupported">No</td>
    <td></td>
  </tr>
  <tr>
    <td>device-specific ICV settings the environment variables</td>
    <td class="unsupported">No</td>
    <td></td>
  </tr>
  <tr>
    <td>assume directive</td>
    <td class="unsupported">No</td>
    <td></td>
  </tr>
  <tr>
    <td>Loop transformation constructs</td>
    <td class="unsupported">No</td>
    <td></td>
  </tr>
  <tr>
    <td>iterators in <code>target update</code> motion clauses and map clauses</td>
    <td class="unsupported">No</td>
    <td></td>
  </tr>
  <tr>
    <td>indirect calls to the device version of a procedure or function in target regions</td>
    <td class="unsupported">No</td>
    <td></td>
  </tr>
  <tr>
    <td><code>interop</code> directive</td>
    <td class="unsupported">No</td>
    <td></td>
  </tr>
  <tr>
    <td><code>omp_interop_t</code> object support in runtime routines</td>
    <td class="unsupported">No</td>
    <td></td>
  </tr>
  <tr>
    <td><code>present</code> argument to <code>defaultmap</code> clause</td>
    <td class="unsupported">No</td>
    <td></td>
  </tr>
  <tr>
    <td><code>ompt_scope_endpoint_t</code> enum: <code>ompt_scope_beginend</code></td>
    <td class="unsupported">No</td>
    <td></td>
  </tr>
  <tr>
    <td><code>ompt_sync_region_t</code> enum additions</td>
    <td class="unsupported">No</td>
    <td></td>
  </tr>
  <tr>
    <td><code>ompt_state_t</code> enum: <code>ompt_state_wait_barrier_implementation</code> and <code>ompt_state_wait_barrier_teams</code></td>
    <td class="unsupported">No</td>
    <td></td>
  </tr>
  <tr>
    <td><code>ompt_callback_target_data_op_emi_t</code>, <code>ompt_callback_target_emi_t</code>, <code>ompt_callback_target_map_emi_t</code> and <code>ompt_callback_target_submit_emi_t</code></td>
    <td class="unsupported">No</td>
    <td></td>
  </tr>
  <tr>
    <td><code>ompt_callback_error_t</code> type</td>
    <td class="unsupported">No</td>
    <td></td>
  </tr>
  <tr>
    <td>Support <code>begin/end declare target</code> syntax in C/C++</td>
    <td class="unsupported">No</td>
    <td></td>
  </tr>
  <tr>
</tbody>
</table>


<h3 id="omp5.2">OpenMP 5.2</h3>

<table class="ompstatus">
<thead>
  <tr>
    <th>Feature</th>
    <th>GCC Version</th>
    <th>Comments</th>
  </tr>
</thead>
<tbody>
    <tr>
    <td><code>omp_in_explicit_task</code> routine and <em>implicit-task-var</em> ICV</td>
    <td class="unsupported">No</td>
    <td></td>
  </tr>
  <tr>
    <td><code>omp</code>/<code>ompx</code>/<code>omx</code> sentinels and <code>omp_</code>/<code>ompx_</code> namespaces</td>
    <td class="other">N/A</td>
    <td></td>
  </tr>
  <tr>
    <td>Clauses on <code>end</code> directive can be on directive</td>
    <td class="unsupported">No</td>
    <td></td>
  </tr>
  <tr>
    <td>Deprecation of no-argument <code>destroy</code> clause on <code>depobj</code></td>
    <td class="unsupported">No</td>
    <td></td>
  </tr>
  <tr>
    <td><code>linear</code> clause syntax changes and <code>step</code> modifier</td>
    <td class="unsupported">No</td>
    <td></td>
  </tr>
  <tr>
    <td>Deprecation of minus operator for reductions</td>
    <td class="unsupported">No</td>
    <td></td>
  </tr>
  <tr>
    <td>Deprecation of separating <code>map</code> modifiers without comma</td>
    <td class="unsupported">No</td>
    <td></td>
  </tr>
  <tr>
    <td><code>declare mapper</code> with iterator and <code>present</code> modifiers</td>
    <td class="unsupported">No</td>
    <td></td>
  </tr>
  <tr>
    <td>If a matching mapped list item is not found in the data environment, the pointer retains its original value</td>
    <td class="unsupported">No</td>
    <td></td>
  </tr>
  <tr>
    <td>New <code>enter</code> clause as alias for <code>to</code> on declare target directive</td>
    <td class="supported"><a href="../../gcc-13/changes.html#languages">GCC&nbsp;13</a></td>
    <td></td>
  </tr>
  <tr>
    <td>Deprecation of <code>to</code> clause on declare target directive</td>
    <td class="unsupported">No</td>
    <td></td>
  </tr>
  <tr>
    <td>Extended list of directives permitted in Fortran pure procedures</td>
    <td class="unsupported">No</td>
    <td></td>
  </tr>
  <tr>
    <td>New <code>allocators</code> directive for Fortran</td>
    <td class="unsupported">No</td>
    <td></td>
  </tr>
  <tr>
    <td>Deprecation of <code>allocator</code> directive for Fortran allocatables/pointers</td>
    <td class="unsupported">No</td>
    <td></td>
  </tr>
  <tr>
    <td>Optional paired <code>end</code> directive with <code>dispatch</code></td>
    <td class="unsupported">No</td>
    <td></td>
  </tr>
  <tr>
    <td>New <code>memspace</code> and <code>traits</code> modifiers for <code>uses_allocators</code></td>
    <td class="unsupported">No</td>
    <td></td>
  </tr>
  <tr>
    <td>Deprecation of traits array following the allocator_handle expression in <code>uses_allocators</code></td>
    <td class="unsupported">No</td>
    <td></td>
  </tr>
  <tr>
    <td>New <code>otherwise</code> clause as alias for <code>default</code> on metadirectives</td>
    <td class="unsupported">No</td>
    <td></td>
  </tr>
  <tr>
    <td>Deprecation of <code>default</code> clause on metadirectives</td>
    <td class="unsupported">No</td>
    <td></td>
  </tr>
  <tr>
    <td>Deprecation of delimited form of <code>declare target</code></td>
    <td class="unsupported">No</td>
    <td></td>
  </tr>
  <tr>
    <td>Reproducible semantics changed for <code>order(concurrent)</code></td>
    <td class="unsupported">No</td>
    <td></td>
  </tr>
  <tr>
    <td><code>allocate</code> and <code>firstprivate</code> clauses on <code>scope</code></td>
    <td class="supported"><a href="../../gcc-13/changes.html#languages">GCC&nbsp;13</a></td>
    <td></td>
  </tr>
  <tr>
    <td><code>ompt_callback_work</code></td>
    <td class="unsupported">No</td>
    <td></td>
  </tr>
  <tr>
    <td>Default map type for <code>map</code> clause in <code>target enter/exit data</code></td>
    <td class="unsupported">No</td>
    <td></td>
  </tr>
  <tr>
    <td>New <code>doacross</code> clause as alias for <code>depend</code> with <code>source</code>/<code>sink</code> modifier</td>
    <td class="unsupported">No</td>
    <td></td>
  </tr>
  <tr>
    <td>Deprecation of <code>depend</code> with <code>source</code>/<code>sink</code> modifier</td>
    <td class="unsupported">No</td>
    <td></td>
  </tr>
  <tr>
    <td><code>omp_cur_iteration</code> keyword</td>
    <td class="unsupported">No</td>
    <td></td>
  </tr>
  <tr>
    <td>For Fortran, optional comma between directive and clause</td>
    <td class="unsupported">No</td>
    <td></td>
  </tr>
  <tr>
    <td>Conforming device numbers and <code>omp_initial_device</code> and <code>omp_invalid_device</code> enum/PARAMETER</td>
    <td class="unsupported">No</td>
    <td></td>
  </tr>
  <tr>
    <td><em>interop_types</em> in any position of the modifier list for the <code>init</code> clause of the <code>interop</code> construct</td>
    <td class="unsupported">No</td>
    <td></td>
  </tr>
  <tr>
    <td>Initial value of <em>default-device-var</em> ICV with <code>OMP_TARGET_OFFLOAD=mandatory</code></td>
    <td class="unsupported">No</td>
    <td></td>
  </tr>
</tbody>
</table>


<h2 id="omp-status">OpenMP Releases and Status</h2>
<dl>
<dt><b>November 9, 2021</b></dt>
<dd><p><a href="https://www.openmp.org/wp-content/uploads/OpenMP-API-Specification-5-2.pdf">OpenMP
Version 5.2</a> has been released.</p></dd>

<dt><b>July 15, 2021</b></dt>
<dd><p><a href="https://www.openmp.org/wp-content/uploads/openmp-TR10.pdf">OpenMP
Technical Report 10: Version 5.2 Public Comment Draft</a> has been released.</p></dd>

<dt><b>November 13, 2020</b></dt>
<dd><p><a href="https://www.openmp.org/wp-content/uploads/OpenMP-API-Specification-5-1.pdf">OpenMP
Version 5.1</a> has been released.</p></dd>

<dt><b>August 20, 2020</b></dt>
<dd><p><a href="https://www.openmp.org/wp-content/uploads/openmp-TR9.pdf">OpenMP
Technical Report 9: Version 5.1 Public Comment Draft</a> has been released.</p></dd>

<dt><b>May 7, 2020</b></dt>
<dd><p><a href="../../gcc-10/">GCC 10 has been released</a>; it adds a number of
newly implemented OpenMP 5.0 features on top of the GCC 9 release such as
<code>conditional</code> <code>lastprivate</code> clause, <code>scan</code>
and <code>loop</code> directives, <code>order(concurrent)</code> and
<code>use_device_addr</code> clauses support, <code>if</code> clause on
<code>simd</code> construct or partial support for the
<code>declare&nbsp;variant</code> directive, getting closer to full support
of the OpenMP 5.0 standard.</p></dd>

<dt><b>May 3, 2019</b></dt>
<dd><p><a href="../../gcc-9/">GCC 9 has been released</a> and
version 5.0 of the OpenMP specification is now partially supported in the C
and C++ compilers. For details which features of OpenMP 5.0 are and which
are not supported in the GCC 9 release see
<a href="https://gcc.gnu.org/legacy-ml/gcc-patches/2018-11/msg00628.html">this mail</a>.
</p></dd>

<dt><b>November 8, 2018</b></dt>
<dd><p>The <a href="https://www.openmp.org/specifications/">OpenMP v5.0</a>
specification has been released.</p></dd>

<dt><b>May 2, 2017</b></dt>
<dd><p><a href="../../gcc-7/">GCC 7 has been released</a> and
version 4.5 of the OpenMP specification is now partially supported in the
Fortran compiler; the largest missing item is structure element
mapping.</p></dd>

<dt><b>April 27, 2016</b></dt>
<dd><p><a href="../../gcc-6/">GCC 6 has been released</a> and
version 4.5 of the OpenMP specification is now supported in the C and
C++ compilers</p></dd>

<dt><b>November 14, 2015</b></dt>
<dd><p>The final <a
href="https://www.openmp.org/wp-content/uploads/openmp-4.5.pdf">OpenMP v4.5</a>
specification has been released.</p></dd>

<dt><b>October 13, 2015</b></dt>
<dd><p>The <code>gomp-4_1-branch</code> has been merged into
mainline, so GCC 6 and later will feature OpenMP v4.5 support for
C and C++.</p></dd>

<dt><b>June 30, 2014</b></dt>
<dd><p>Fortran OpenMP v4.0 support has been backported to
<code>gcc-4_9-branch</code> and will be available in the upcoming
GCC 4.9.1 release.</p></dd>

<dt><b>June 18, 2014</b></dt>
<dd><p>The last major part of Fortran OpenMP v4.0 support has been
committed into mainline.</p></dd>

<dt><b>October 11, 2013</b></dt>
<dd><p>The <code>gomp-4_0-branch</code> has been merged into
mainline, so GCC 4.9 and later will feature OpenMP v4.0 support for
C and C++.</p></dd>

<dt><b>July 23, 2013</b></dt>
<dd><p>The final OpenMP v4.0 specification has been released.</p></dd>

<dt><b>August 2, 2011</b></dt>
<dd><p>The <code>gomp-3_1-branch</code> has been merged into
mainline, so GCC 4.7 and later will feature OpenMP v3.1 support.</p></dd>

<dt><b>July 9, 2011</b></dt>
<dd><p>The final OpenMP v3.1 specification has been released.</p></dd>

<dt><b>February 6, 2011</b></dt>
<dd><p>A draft of the OpenMP v3.1 specification has been released for
public review.  The <code>gomp-3_1-branch</code> branch has been
created and work began on implementing v3.1 support.</p></dd>

<dt><b>June 6, 2008</b></dt>
<dd><p>The <code>gomp-3_0-branch</code> has been merged into
mainline, so GCC 4.4 and later will feature OpenMP v3.0 support.</p></dd>

<dt><b>May 12, 2008</b></dt>
<dd><p>The final OpenMP v3.0 specification has been released.</p></dd>

<dt><b>October 22, 2007</b></dt>
<dd><p>Draft of the OpenMP v3.0 specification has been released for
public review, the <code>gomp-3_0-branch</code> branch has been
created and work began on implementing v3.0 support.</p></dd>

<dt><b>March 9, 2006</b></dt>
<dd><p>The branch has been merged into mainline, so starting with
GCC 4.2 the compiler supports the OpenMP v2.5 specification.</p></dd>

<dt><b>November 18, 2005</b></dt>
<dd><p>The branch is ready to be merged into mainline.  All three
front ends are functional and there should not be many corners of the
standard left to implement.  There are 5 main modules to merge into
mainline: (1) runtime library, (2) code generation, (3) C front end,
(4) C++ front end, and, (5) Fortran front end.</p></dd>

<dt><b>October 20, 2005</b></dt>
<dd><p>The runtime library is functionally complete.  The syntax
parsers for C, C++ and Fortran are complete, though there are
still dusty corners with respect to semantic translation to be
resolved.  Adventurous users who don't mind the compiler crashing
on every other source file are encouraged to begin filing bugs.</p></dd>
</dl>
</body>
</html>
